字符串的处理

  到目前为止,对字符串的使用还仅限于把字符串写到控制台上,从控制台上读取字符串,以及使用 + 运算符连接字符串。在编写较有趣的应用程序时,会发现字符串的操作非常多。所以,下面占用几页的篇幅介绍C#中较常用的字符串处理技巧。

  首先要注意,string 类型变量可以看成是 char 变量的只读数组。这样,就可以使用下面的语法访问每个字符:

        string myString = "A string";
        char myChar = myString[1];

  但不能采用这种方式为各个字符赋值。为了获得一个可写的 char 数组,可以使用下面的代码,其中使用了数组变量 ToCharArray() 命令:

        string myString = "A string";
        char[] myChars = myString.ToCharArray();

  接着就可以采用标准方式处理 char 数组了。也可以在 foreach 循环中使用字符串,例如:

        foreach ( char character in myString )
        {
            Console.WriteLine("{0}", character);
        }

  与数组一样,还可以使用 myString.Length 获取元素的个数,这将给出字符串中的字符数,例如:

        string myString = Console.ReadLine();
        Console.WriteLine("You typed {0} characters", myString.Length);

  其他基本字符串处理技巧采用与这个 <string>.ToCharArray() 命令类似的格式使用命令。两个简单却有效的命令是 <string>.ToLower()<string>.ToUpper()。它们可以分别把字符串转换为小写或大写形式。要明白为什么它们非常有用,可以考虑下面的情形:要检查用户的某个响应,例如字符串 yes。如果可以把用户输入的字符串转换为小写形式,就也能检查字符串 YESYesyeS 等,第 4 章介绍了这样一个示例:

        string userResponse = Console.ReadLine();
        if ( userResponse.ToLower() == "yes" )
        {
            // Act on response
        }

  注意 ⚠️,这个命令与本节的其他命令一样,并未真正改变应用它的字符串。把这个命令与字符串结合使用,就会创建一个新的字符串,以便与另一个字符串进行比较(如上所述),或者赋给另一个变量。该变量可以是当前操作的变量,例如:

        userResponse = userResponse.ToLower();

  记住这一点很重要,因为只写出下面的代码是没用的:

        userResponse.ToLower();

  下面看看在简化用户输入方面还可以做什么。如果用户无意间在输入内容的前面或后面添加了多余的空格,会怎样?此时,上述代码就不起作用了。这就需要删除输入字符串中的空格,此时可以使用 <string>.Trim() 命令来处理。

        string userResponse = Console.ReadLine();
        userResponse = userResponse.Trim();
        if ( userResponse.ToLower() == "yes" )
        {
            // Act on response.
        }

  使用该命令,还可以检测如下的字符串:

        " YES"
        "Yes "

  也可以使用这些命令删除其他字符,只要在一个 char 数组中指定这些字符即可,例如:

        char[] trimChars = { ' ', 'e', 's' };
        string userResponse = Console.ReadLine();
        userResponse = userResponse.ToLower();
        userResponse = userResponse.Trim(trimChars);
        if ( userResponse == "y" )
        {
            // Act on response.
        }

  这些删除字符串前面或后面的所有空格、字母 es。如果字符串中没有其他字符,就会检测以下字符串:

        "Yeeeees"
        " y"

  还可以使用 <string>.TrimStart()<string>.TrimEnd() 命令,它们可以把字符串前面或后面的空格删掉。使用这些命令时也可以指定 char 数组。

  还有另外两个字符串命令可以处理字符串的空格:<string>.PadLeft()<string>.PadRight()。它们可以在字符串的左边或右边添加空格,使字符串达到指定的长度。其语法如下:

        <string>.PadX ( <desiredLength> );

  例如:

        myString = "Aligned";
        myString = myString.PadLeft(10);

  这将在 myString 中把 3 个空格添加到单词 aligned 的左边。这些方法可以用于在列中对齐字符串,特别适用于放置包含数字的字符串。

  与修整命令一样,还可以按第二种方式使用这些命令,即提供要添加到字符串上的字符。但是这需要一个 char,而不是像修整命令那样指定一个 char 数组。例如:

        myString = "Aligned";
        myString = myString.PadLeft(10, '-');

  这将在 myString 的开头加上 3 个短横线。

  还有许多这样的字符串处理命令,其中一些只用于非常特殊的情况,在后面的章节中遇到它们时再进行讨论。在继续下面内容之前,介绍 Visual Studio 2013 中的一个特性,前几章曾提及(特别是本章)这个特性。下面的示例会试验语句自动完成功能,IDE通过这种功能给出用户有可能要插入的代码。

在 Program.cs 中输入下列代码,注意输入过程中弹出的窗口:

        static void Main(string[] args)
        {
            string myString = "This is a test.";
            char[] separator = { ' ' };
            string[] myWords;
            myWords = myString.
        }

输入最后的句点时,注意 ⚠️会弹出如图 5-12 所示的窗口。

图5-12 图 5-12

不要移动光标,键入 sp,弹出窗口就会改变,显示一个工具提示窗口,如图 5-13 所示。

图5-13 图 5-13

输入字符 “(se”,会弹出另外一个窗口和工具提示,如图 5-14 所示。

图5-14 图 5-14

输入两个字符 ");",代码如下所示,弹出窗口随之消失。

        static void Main(string[] args)
        {
            string myString = "This is a test.";
            char[] separator = { ' ' };
            string[] myWords;
            myWords = myString.Split(separator);
        }

添加如下代码,注意弹出的窗口。

        static void Main(string[] args) 
        { 
            string myString = "This is a test."; 
            char[] separator = { ' ' }; 
            string[] myWords; 
            myWords = myString.Split( separator ); 
            foreach ( string word in myWords ) 
            { 
                Console.WriteLine("{0}", word); 
            } 
            Console.ReadKey(); 
        }

  示例的说明

  在这段代码中,要注意两点。第一点是所使用的新字符串命令,第二点是使用了自动完成功能。使用命令 <string>.Split()string 转换为 string 数组,把它在指定的位置分隔开。这些位置采用 char 数组形式,在本例中该数组只有一个元素,即空格字符:

        char[] separator = { ' ' };

  下面的代码把字符串在每个空格处分解开,并获取得到的子字符串,即得到包含单个单词的数组:

        string[] myWords; 
        myWords = myString.Split( separator );

  接着使用 foreach 循环迭代这个数组中的单词,并把这些单词写到控制台上:

        foreach ( string word in myWords )
        {
            Console.WriteLine("{0}", word);
        }

  得到的每个单词都没有空格,单词的内部和两端都没有空格。在使用 Split() 时,删除了分隔符。

  接着分析一下自动完成功能。VS 是智能化极高的程序包,在用户键入代码时会提供许多关于代码的信息。即使在一个新行上键入第一个字符,IDE 也试图帮助用户,列出建议的关键字、变量名、类型名等。只要在上面的代码输入 3 个字母 str,IDE 就会猜出要输入 string。在键入变量名时,这个功能会更有用。在较长的代码中,常会忘记要使用的变量名。IDE 会在用户键入代码的过程中弹出一系列变量名,用户可从中选择,不必查看以前的代码。

  在 myString 的后面键入句点时,IDE 知道 myString 是一个字符串,也知道你要指定一个字符串命令,于是显示可用选项。此时可以停止键入,使用上下箭头键选择需要的命令。在这些可用命令中移动时,IDE 会告诉你当前选中命令的含义,以及使用它的语法。

  在开始键入更多字符时,IDE 会自动把它猜测你可能要使用的命令移到命令列表的顶部。一旦它显示出需要的命令,就可以继续键入,就像已经键入完整的名称一样,所以键入 “(” 会直接跳到为某些命令指定需要的额外信息的地方--IDE 甚至会告诉用户该信息必须采用的格式,并显示这些接受各种信息的命令选项。

  IDE 的这项功能(也称为 IntelliSense)使用起来非常方便,可以使你轻松地找到奇怪类型的信息。查看 string 类型的所有命令时很有趣的,这不会使计算机崩溃,试一试吧!

  有时所显示的信息会遮挡前面已经键入的代码,这是很恼人的,因为在键入时可能需要参考被遮挡的代码。此时可按下 Ctrl 键,使命令列表变成透明的,以便查看被遮挡的代码。

🔚